package com.freeheart.aop.log;

import org.springframework.core.NamedThreadLocal;
import org.springframework.util.CollectionUtils;

import java.util.Collection;
import java.util.Collections;
import java.util.HashSet;
import java.util.Set;

/**
 * 用于管理LogScan中的扫描包
 */
public class LogScanManager {

    private static final ThreadLocal<Set<String>> basePackages = new NamedThreadLocal<>("LogScan basePackages");

    /**
     * 获取存储的LogScan的basePackages
     *
     * @return basePackages
     */
    public static Set<String> getBasePackages() {
        Set<String> packages = basePackages.get();
        return CollectionUtils.isEmpty(packages) ? Collections.emptySet() : Collections.unmodifiableSet(packages);
    }

    /**
     * 获取并清除ThreadLocal中的数据。学到内存泄露问题，觉得有必要清除不需要的内存占用
     *
     * @return basePackages
     */
    public static Set<String> getBasePackagesAndRemove() {
        Set<String> packages = getBasePackages();
        basePackages.remove();
        return packages;
    }

    /**
     * 注册、添加basePackages。添加过程中，并在未进行有效路径检验。
     *
     * @param basePack 添加的LogScan的basePackages
     */
    public static void registerBasePackages(Collection<String> basePack) {
        if (CollectionUtils.isEmpty(basePackages.get())) {
            basePackages.set(new HashSet<>());
        }
        Set<String> packages = basePackages.get();
        packages.addAll(basePack);
    }

    /**
     * 是否存在basePackages
     *
     * @return true是存在。false是不存在
     */
    public static boolean hasBasePackages() {
        return !CollectionUtils.isEmpty(basePackages.get());
    }
}
